package com.example;

public class TestInitialOrder {

    public static class Parent {
        private String name;
        private int age;
        private String text = "hello";

        public Parent(){
            System.out.println("Parent的构造器中读取到name的值为：" + name); // name: null
            System.out.println("Parent的构造器中读取到age的值为：" + age);   // age: 0
            System.out.println("Parent的构造器中读取到text的值为：" + text); // text: "hello"

            // 调用一个被子类重写的方法
            this.fn();
        }

        public void fn(){
            System.out.println("parent.fn()被调用");
        }
    }

    public static class Son extends Parent {
        private String content = "world";

        public Son(){
            System.out.println("Son的构造器中读取到content的值为：" + content); // world
        }

        @Override
        public void fn() {
            System.out.println("son.fn()被调用，content的值为：" + content);
        }
    }

    public static void main(String[] args) {
        new Son();
        // 输出：
        // Parent的构造器中读取到name的值为：null
        // Parent的构造器中读取到age的值为：0
        // Parent的构造器中读取到text的值为：hello
        // son.fn()被调用，content的值为：null（注意这个！由于Son重写了fn方法，而该方法在父类的构造器中被调用，由于多态，此时调用的是子类的重写后的方法，子类的方法中访问了子类中定义content字段，然而子类定义的字段尚未被初始化，所以输出的是null而不是world）
        // Son的构造器中读取到content的值为：world
    }
}
